Linux 命令- tshark

        在Linux下,当我们需要抓取网络数据包分析时,通常是使用tcpdump抓取网络raw数据包存到一个文件,然后下载到本地使用wireshark界面网络分析工具进行网络包分析。

        最近才发现,原来wireshark也提供有Linux命令行工具-tshark。tshark不仅有抓包的功能,还带了解析各种协议的能力。

        tshark是wireshark安装目录下命令行工具

        使用tshark可以通过自动化方式调用wireshark

        默认机器上是没有安装这个工具的。使用yum安装

1
yum install -y wireshark

        也可以到官网下载源码,具体安装方法

命令参数

1. 抓包接口类

  • -i 设置抓包的网络接口,不设置则默认为第一个非自环接口。
  • -D 列出当前存在的网络接口。在不了解OS所控制的网络设备时,一般先用“tshark -D”查看网络接口的编号以供-i参数使用。
  • -f 设定抓包过滤表达式(capture filter expression)。抓包过滤表达式的写法雷同于tcpdump,可参考tcpdump man page的有关部分。
  • -s 设置每个抓包的大小,默认为65535,多于这个大小的数据将不会被程序记入内存、写入文件。(这个参数相当于tcpdump的-s,tcpdump默认抓包的大小仅为68)
  • -p 设置网络接口以非混合模式工作,即只关心和本机有关的流量。
  • -B 设置内核缓冲区大小,仅对windows有效。
  • -y 设置抓包的数据链路层协议,不设置则默认为-L找到的第一个协议,局域网一般是EN10MB等。
  • -L 列出本机支持的数据链路层协议,供-y参数使用。

2. 抓包停止条件

  • -c 抓取的packet数,在处理一定数量的packet后,停止抓取,程序退出。
  • -a 设置tshark抓包停止向文件书写的条件,事实上是tshark在正常启动之后停止工作并返回的条件。条件写为test:value的形式,如“-a duration:5”表示tshark启动后在5秒内抓包然后停止;“-a filesize:10”表示tshark在输出文件达到10kB后停止;“-a files:n”表示tshark在写满n个文件后停止。(windows版的tshark0.99.3用参数“-a files:n”不起作用——会有无数多个文件生成。由于-b参数有自己的files参数,所谓“和-b的其它参数结合使用”无从说起。这也许是一个bug,或tshark的man page的书写有误。)

3. 文件输出控制

  • -b 设置ring buffer文件参数。ring buffer的文件名由-w参数决定。-b参数采用test:value的形式书写。“-b duration:5”表示每5秒写下一个ring buffer文件;“-b filesize:5”表示每达到5kB写下一个ring buffer文件;“-b files:7”表示ring buffer文件最多7个,周而复始地使用,如果这个参数不设定,tshark会将磁盘写满为止。

4. 文件输入

  • -r 设置tshark分析的输入文件。tshark既可以抓取分析即时的网络流量,又可以分析dump在文件中的数据。-r不能是命名管道和标准输入。

5. 处理类

  • -R 设置读取(显示)过滤表达式(read filter expression)。不符合此表达式的流量同样不会被写入文件。注意,读取(显示)过滤表达式的语法和底层相关的抓包过滤表达式语法不相同,它的语法表达要丰富得多,请参考http://www.ethereal.com/docs/dfref/和http://www.ethereal.com/docs/man-pages/ethereal-filter.4.html。类似于抓包过滤表达式,在命令行使用时最好将它们quote起来。
  • -n 禁止所有地址名字解析(默认为允许所有)。
  • -N 启用某一层的地址名字解析。“m”代表MAC层,“n”代表网络层,“t”代表传输层,“C”代表当前异步DNS查找。如果-n和-N参数同时存在,-n将被忽略。如果-n和-N参数都不写,则默认打开所有地址名字解析。
  • -d 将指定的数据按有关协议解包输出。如要将tcp 8888端口的流量按http解包,应该写为“-d tcp.port==8888,http”。注意选择子和解包协议之间不能留空格。

6. 输出类

  • -w 设置raw数据的输出文件。这个参数不设置,tshark将会把解码结果输出到stdout。“-w-”表示把raw输出到stdout。如果要把解码结果输出到文件,使用重定向“>”而不要-w参数。
  • -F 设置输出raw数据的格式,默认为libpcap。“tshark -F”会列出所有支持的raw格式。
  • -V 设置将解码结果的细节输出,否则解码结果仅显示一个packet一行的summary。
  • -x 设置在解码输出结果中,每个packet后面以HEX dump的方式显示具体数据。
  • -T 设置解码结果输出的格式,包括text,ps,psml和pdml,默认为text。
  • -t 设置解码结果的时间格式。“ad”表示带日期的绝对时间,“a”表示不带日期的绝对时间,“r”表示从第一个包到现在的相对时间,“d”表示两个相邻包之间的增量时间(delta)。
  • -S 在向raw文件输出的同时,将解码结果打印到控制台。
  • -l 在处理每个包时即时刷新输出。
  • -X 扩展项。
  • -q 设置安静的stdout输出(例如做统计时)
  • -z 设置统计参数。

7. 其它

  • -h 显示命令行帮助。
  • -v 显示tshark的版本信息。
  • -o 重载选项。

使用实例

实例1:显示访问http请求的域名以及URI

        命令

1
tshark -n -t a -R http.request -T fields -e "frame.time" -e "ip.src" -e "http.host" -e "http.request.method" -e "http.request.uri"

实例2:抓取mysql的查询

        命令

1
tshark -n -i eth1 -R 'mysql.query' -T fields -e "ip.src" -e "mysql.query"

        另外一种方法

1
tshark -i eth1 port 3307 -d tcp.port==3307,mysql -z "proto,colinfo,mysql.query,mysql.query"

实例3:抓取指定类型的mysql查询

        命令

1
tshark -n -i eth1 -R 'mysql matches "SELECT|INSERT|DELETE|UPDATE"' -T fields -e "ip.src" -e "mysql.query"

实例4:统计http的状态

        命令

1
tshark -n -q -z http,stat, -z http,tree

        注意:这个命令,直到ctrl+e才会显示出结果

实例5:tshark增加时间标签

        命令

1
2
tshark -t ad
tshark -t a

实例6:查看当前服务器的web请求

        命令

1
tshark -n -t a -R http.request -T fields -e "frame.time" -e "ip.src" -e "http.host" -e "http.request.method" -e "http.request.uri"

        tshark主要掌握这一个用法即可。这条命令用于web服务器,可以显示下面信息:

1
2
3
4
5
6
7
8
[root@lnmp ~]# tshark -n -t a -R http.request -T fields -e "frame.time" -e "ip.src" -e "http.host" -e "http.request.method" -e "http.request.uri"
Running as user "root" and group "root". This could be dangerous.
Capturing on eth0
Jul 13, 2017 22:00:25.129421639 192.168.0.100 prtas.videocc.net GET /v1/view?pid=1499954712122X1245558&uid=04ad877579&vid=04ad877579e0b8ab39e6eafe7709cdf6_0&flow=12074276&pd=1&sd=89&ts=1499954802350&sign=3916b818465aa3ffcb7c81773bc8805f&session_id=&param1=&param2=&param3=&param4=&param5=&cts=0&duration=1004&href=http%3A%2F%2Fv.apelearn.com%2Fstudent.php%3Fview_unit%3D897
Jul 13, 2017 22:00:27.449646478 [FF02::C]:1900 M-SEARCH *
Jul 13, 2017 22:00:31.449976172 [FF02::C]:1900 M-SEARCH *
Jul 13, 2017 22:00:34.449975277 [FF02::C]:1900 M-SEARCH *
Jul 13, 2017 22:00:35.194957223 192.168.0.100 prtas.videocc.net GET

        这类似于web访问日志,有时候若服务器没有配置访问日志,可以临时使用该命令查看一下当前服务器的web请求。